package com.sojson.util.pay.wx.constant;

import static com.sojson.constant.ConstantByMap.CERT_PATH;

import com.sojson.constant.Constant;
import com.sojson.constant.IpConfig;
import com.sojson.util.servlet.ServletUtil;
import com.sojson.util.text.Convert;

/**
 * 微信静态属性类
 * 
 * @author liu
 * @date 2020-11-02
 */
public interface WxConstant {

    // =======================================================================================================
    // ===============================================华丽的分割线===============================================
    // =======================================================================================================
    /** 环境代码(1:正式环境,2:测试环境) */
    Integer ENVIRONMENT = Convert.toInt(Constant.PROPERTIES.getProperty("so.environment.pay.wx"), 2);
    // =======================================================================================================
    // =================================================自定义的================================================
    // =======================================================================================================
    /** 给微信统一支付的异步通知返回的成功信息 */
    String RES_SUCCESS_UNIFIEDORDER =
        "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
    /** 给微信统一支付的异步通知返回的失败信息 */
    String RES_FAIL_UNIFIEDORDER =
        "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[FAIL]]></return_msg></xml>";
    /** 给微信统一支付的异步通知返回的成功信息 */
    String RES_SUCCESS_CREATE_ORDER = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
        + "<appid><![CDATA[%s]]></appid>" + "<mch_id><![CDATA[%s]]></mch_id>" + "<nonce_str><![CDATA[%s]]></nonce_str>"
        + "<prepay_id><![CDATA[%s]]></prepay_id>" + "<result_code><![CDATA[SUCCESS]]></result_code>"
        + "<sign><![CDATA[%s]]></sign>" + "</xml>";
    /** 给微信统一支付的异步通知返回的失败信息 */
    String RES_FAIL_CREATE_ORDER_RETURN_CODE =
        "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[%s]]></return_msg>"
            + "<appid><![CDATA[%s]]></appid>" + "<mch_id><![CDATA[%s]]></mch_id>"
            + "<nonce_str><![CDATA[%s]]></nonce_str>" + "<prepay_id><![CDATA[%s]]></prepay_id>"
            + "<result_code><![CDATA[FAIL]]></result_code>" + "<sign><![CDATA[%s]]></sign>" + "</xml>";
    /** 给微信统一支付的异步通知返回的失败信息 */
    String RES_FAIL_CREATE_ORDER_RESULT_CODE = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
        + "<appid><![CDATA[%s]]></appid>" + "<mch_id><![CDATA[%s]]></mch_id>" + "<nonce_str><![CDATA[%s]]></nonce_str>"
        + "<prepay_id><![CDATA[%s]]></prepay_id>" + "<result_code><![CDATA[FAIL]]></result_code>"
        + "<err_code_des><![CDATA[%s]]></err_code_des>" + "<sign><![CDATA[%s]]></sign>" + "</xml>";

    // =======================================================================================================
    // =======================================================================================================
    // =======================================================================================================
    /** 失败CODE */
    String FAIL = "FAIL";
    /** 成功CODE */
    String SUCCESS = "SUCCESS";
    /** 订单详情扩展字符串(Sign=WXPay) */
    String PACKAGE_SING_WXPAY = "Sign=WXPay";
    /** 订单详情扩展字符串(prepay_id=wx201410272009395522657a690389285100) */
    String PACKAGE_PERPAY_ID = "prepay_id=%s";
    /** 签名方式 */
    String SING_TYPE_RSA = "RSA";

    // =======================================================================================================
    // ===============================================缓存中的Key===============================================
    // =======================================================================================================
    /** 微信公众平台appid */
    String GZ_APPID_CACHE_NAME = "wx_gz_appid";
    /** 微信公众平台appsecret */
    String GZ_APPSECRET_CACHE_NAME = "wx_gz_appsecret";
    /** 微信网站应用appid */
    String WEB_APPID_CACHE_NAME = "wx_web_appid";
    /** 微信网站应用appsecret */
    String WEB_APPSECRET_CACHE_NAME = "wx_web_appsecret";
    /** 微信App应用appid */
    String APP_APPID_CACHE_NAME = "wx_app_appid";
    /** 微信App应用appsecret */
    String APP_APPSECRET_CACHE_NAME = "wx_app_appsecret";
    /** 微信小程序应用appid */
    String XCX_APPID_CACHE_NAME = "wx_xcx_appid";
    /** 微信小程序应用appsecret */
    String XCX_APPSECRET_CACHE_NAME = "wx_xcx_appsecret";
    /** 微信默认appid */
    String DEFAULT_APPID_CACHE_NAME = XCX_APPID_CACHE_NAME;
    /** 微信默认appsecret */
    String DEFAULT_APPSECRET_CACHE_NAME = XCX_APPSECRET_CACHE_NAME;
    /** 微信商户号 */
    String MCHID_CACHE_NAME = "wx_mchid";
    /** 微信证书序列号 */
    String CA_SERIALNO_CACHE_NAME = "wx_ca_serial_no";
    /** 微信商户密钥(API密钥) */
    String APIKEY_CACHE_NAME = "wx_apiKey";
    /** 微信APIv3密钥 */
    String APIV3KEY_CACHE_NAME = "wx_apiv3Key";
    /** 微信商户密钥(API密钥)(获取沙箱密钥接口返回的密钥参数) */
    String APIKEY_SANDBOX_SIGNKEY_CACHE_NAME = "sandbox_signkey";

    // =======================================================================================================
    // ================================================证书文件名================================================
    // =======================================================================================================
    /** 微信*cert.p12证书文件名 */
    String CA_CERT_FILE_NAME_P12_CERT = "apiclient_cert.p12";
    /** 微信*cert.p12证书文件路径 */
    String CA_CERT_FILE_PATH_P12_CERT = CERT_PATH + "/" + CA_CERT_FILE_NAME_P12_CERT;
    /** 微信*cert.pem证书文件名 */
    String CA_CERT_FILE_NAME_PEM_CERT = "apiclient_cert.pem";
    /** 微信*cert.pem证书文件路径 */
    String CA_CERT_FILE_PATH_PEM_CERT = CERT_PATH + "/" + CA_CERT_FILE_NAME_PEM_CERT;
    /** 微信*key.pem证书文件名 */
    String CA_CERT_FILE_NAME_PEM_KEY = "apiclient_key.pem";
    /** 微信*key.pem证书文件路径 */
    String CA_CERT_FILE_PATH_PEM_KEY = CERT_PATH + "/" + CA_CERT_FILE_NAME_PEM_KEY;
    /** 微信平台证书文件名 */
    String CA_CERT_FILE_NAME_PEM_WECHATPAY = "wechatpay.pem";
    /** 微信平台证书文件路径 */
    String CA_CERT_FILE_PATH_PEM_WECHATPAY = CERT_PATH + "/" + CA_CERT_FILE_NAME_PEM_WECHATPAY;

    /** ----------------------------以下是微信接口返回的参数---------------------------- */
    /** ----------------------------以下是微信接口返回的参数---------------------------- */
    /** ----------------------------以下是微信接口返回的参数---------------------------- */
    // =======================================================================================================
    // =================================================用户信息================================================
    // =======================================================================================================
    /** 参数: appid(请求统一下单接口时请注意APPID的应用属性,例如公众号场景下,需使用应用属性为公众号的APPID) */
    String FIELD_APPID = "appid";
    /** 参数: openid(用户唯一标识) */
    String FIELD_OPENID = "openid";
    /** 参数: unionid((用户的唯一标识,多平台的唯一标识(WEB,移动...))) */
    String FIELD_UNIONID = "unionid";
    /** 参数: nickname(昵称) */
    String FIELD_NICKNAME = "nickname";
    /** 参数: subscribe(此用户是否关注公众号) */
    String FIELD_SUBSCRIBE = "subscribe";
    /** 参数: sex(性别) */
    String FIELD_SEX = "sex";
    /** 参数: province(省) */
    String FIELD_PROVINCE = "province";
    /** 参数: city(市) */
    String FIELD_CITY = "city";
    /** 参数: country(国家) */
    String FIELD_COUNTRY = "country";
    /** 参数: headimgurl(头像) */
    String FIELD_HEADIMGURL = "headimgurl";
    /** 参数: is_subscribe(是否关注公众账号) */
    String FIELD_IS_SUBSCRIBE = "is_subscribe";
    /** 值-是否关注公众账号: 是 */
    String FIELD_IS_SUBSCRIBE_Y = "Y";
    /** 值-是否关注公众账号: 否 */
    String FIELD_IS_SUBSCRIBE_N = "N";
    // =======================================================================================================
    // =======================================================================================================
    // =======================================================================================================
    /** 参数: access_token(用户授权的唯一票据,用于调用微信的开放接口) */
    String FIELD_ACCESS_TOKEN = "access_token";
    /** 参数: ticket(微信调用JS接口的临时票据) */
    String FIELD_TICKET = "ticket";
    // =======================================================================================================
    // =================================================支付接口================================================
    // =======================================================================================================
    /** 参数: mchid(商户号) */
    String FIELD_MCHID = "mchid";
    /** Get查询参数: mchid(商户号) */
    String PARAM_MCHID_GET = "?mchid=";
    /** 参数: mch_id(商户号) */
    String FIELD_MCH_ID = "mch_id";
    /** 参数: mch_id(商户密钥) */
    String FIELD_MCH_KEY = "mch_key";
    /** 参数: mch_appid<BR/>(商户号的Appid或跟商户号绑定的Appid)<BR/>(请求统一下单接口时请注意APPID的应用属性,例如公众号场景下,需使用应用属性为公众号的APPID) */
    String FIELD_MCH_APPID = "mch_appid";
    /** 参数: amount(金额) */
    String FIELD_AMOUNT = "amount";
    /** 参数: partner_trade_no(商户订单号,需保持唯一性) */
    String FIELD_PARTNER_TRADE_NO = "partner_trade_no";
    /** 参数: device_info(设备号) */
    String FIELD_DEVICE_INFO = "device_info";
    /** 参数: check_name(校验用户姓名选项,NO_CHECK:不校验真实姓名,FORCE_CHECK:强校验真实姓名) */
    String FIELD_CHECK_NAME = "check_name";
    /** 值-校验用户姓名选项: 不校验真实姓名 */
    String FIELD_CHECK_NAME_VALUE_NO_CHECK = "NO_CHECK";
    /** 值-校验用户姓名选项: 强校验真实姓名 */
    String FIELD_CHECK_NAME_VALUE_FORCE_CHECK = "FORCE_CHECK";
    /** 参数: sign(签名) */
    String FIELD_SIGN = "sign";
    /** 参数: sign_type(签名类型) */
    String FIELD_SIGN_TYPE = "sign_type";
    /** 参数: body(商品描述) */
    String FIELD_BODY = "body";
    /** 参数: detail(商品详情(必须是Json格式,单品优惠活动该字段必传,且必须按照规范上传)) */
    String FIELD_DETAIL = "detail";
    /** 参数: notify_url(微信支付通知地址) */
    String FIELD_NOTIFY_URL = "notify_url";
    /** 参数: nonce_str(生成密钥的随机字符串) */
    String FIELD_NONCE_STR = "nonce_str";
    /** 参数: attach(附加数据,用来传自己需要的东西) */
    String FIELD_ATTACH = "attach";
    /** 参数: out_trade_no(商户支付单号: 32个字符内，只能是数字、大小写字母_-|* 且在同一个商户号下唯一) */
    String FIELD_OUT_TRADE_NO = "out_trade_no";
    /** 参数: total_fee(金额,单位: 分(必须是整数)) */
    String FIELD_TOTAL_FEE = "total_fee";
    /** 参数: out_refund_no(商户退款单号: 32个字符内，只能是数字、大小写字母_-|* 且在同一个商户号下唯一) */
    String FIELD_OUT_REFUND_NO = "out_refund_no";
    /** 参数: refund_fee(退款金额,单位: 分(必须是整数)) */
    String FIELD_REFUND_FEE = "refund_fee";
    /** 参数: spbill_create_ip(终端IP) */
    String FIELD_SPBILL_CREATE_IP = "spbill_create_ip";
    /** 参数: trade_type(交易类型,不同的类型决定了调起支付的方式,JSAPI: JSAPI支付,NATIVE: Native支付,APP: APP支付,MWEB: H5支付) */
    String FIELD_TRADE_TYPE = "trade_type";
    /** 值-交易类型: JSAPI支付 */
    String FIELD_TRADE_TYPE_VALUE_JSAPI = "JSAPI";
    /** 值-交易类型: NATIVE支付 */
    String FIELD_TRADE_TYPE_VALUE_NATIVE = "NATIVE";
    /** 值-交易类型: APP支付 */
    String FIELD_TRADE_TYPE_VALUE_APP = "APP";
    /** 值-交易类型: MWEB支付 */
    String FIELD_TRADE_TYPE_VALUE_MWEB = "MWEB";
    /** 参数: product_id(商品ID,交易类型为NATIVE时，此参数必传) */
    String FIELD_PRODUCT_ID = "product_id";
    /** 参数: prepay_id(预支付会话标识,用于后续接口调用中使用,该值有效期为2小时) */
    String FIELD_PREPAY_ID = "prepay_id";
    /** 参数: code_url(二维码链接,trade_type=NATIVE时有返回,此url用于生成支付二维码，然后提供给用户进行扫码支付) */
    String FIELD_CODE_URL = "code_url";
    /** 参数: time_stamp(系统当前时间戳) */
    String FIELD_TIME_STAMP = "time_stamp";
    /** 参数: desc(备注) */
    String FIELD_DESC = "desc";
    /** 参数: trade_state(交易状态) */
    String FIELD_TRADE_STATE = "trade_state";
    /** 值-交易状态: 支付成功 */
    String FIELD_TRADE_STATE_VALUE_SUCCESS = "SUCCESS";
    /** 值-交易状态: 转入退款 */
    String FIELD_TRADE_STATE_VALUE_REFUND = "REFUND";
    /** 值-交易状态: 未支付 */
    String FIELD_TRADE_STATE_VALUE_NOTPAY = "NOTPAY";
    /** 值-交易状态: 已关闭 */
    String FIELD_TRADE_STATE_VALUE_CLOSED = "CLOSED";
    /** 值-交易状态: 已撤销(付款码支付) */
    String FIELD_TRADE_STATE_VALUE_REVOKED = "REVOKED";
    /** 值-交易状态: 用户支付中(付款码支付) */
    String FIELD_TRADE_STATE_VALUE_USERPAYING = "USERPAYING";
    /** 值-交易状态: 支付失败(其他原因,如银行返回失败) */
    String FIELD_TRADE_STATE_VALUE_PAYERROR = "PAYERROR";
    /** 值-交易状态: 已接收,等待扣款 */
    String FIELD_TRADE_STATE_VALUE_ACCEPT = "ACCEPT";
    /** 值-交易状态: 退款处理中 */
    String FIELD_TRADE_STATE_VALUE_PROCESSING = "PROCESSING";
    // =======================================================================================================
    // ===============================================公众号二维码===============================================
    // =======================================================================================================
    /** 参数: action_name(二维码类型) */
    String FIELD_ACTION_NAME = "action_name";
    /** 值-二维码类型: 临时的整型参数值 */
    String FIELD_ACTION_NAME_VALUE_SCENE = "QR_SCENE";
    /** 值-二维码类型: 临时的字符串参数值 */
    String FIELD_ACTION_NAME_VALUE_STR_SCENE = "QR_STR_SCENE";
    /** 值-二维码类型: 永久的整型参数值 */
    String FIELD_ACTION_NAME_VALUE_LIMIT_SCENE = "QR_LIMIT_SCENE";
    /** 值-二维码类型: 永久的字符串参数值 */
    String FIELD_ACTION_NAME_VALUE_LIMIT_STR_SCENE = "QR_LIMIT_STR_SCENE";
    /** 参数: expire_seconds(临时二维码的有效时间,临时的二维码需要的参数) */
    String FIELD_EXPIRE_SECONDS = "expire_seconds";
    /** 参数: action_info(二维码详细信息) */
    String FIELD_ACTION_INFO = "action_info";
    /** 参数: scene */
    String FIELD_SCENE = "scene";
    /** 参数: scene_id(场景值ID: 整型类型的内容) */
    String FIELD_SCENE_ID = "scene_id";
    /** 参数: scene_str(场景值ID: 字符串类型的内容) */
    String FIELD_SCENE_STR = "scene_str";
    // =======================================================================================================
    // =================================================状态码=================================================
    // =======================================================================================================
    /** 参数: errcode */
    String FIELD_ERRCODE = "errcode";
    /** 参数: errmsg */
    String FIELD_ERRMSG = "errmsg";
    /** 参数: return_code(XML格式) */
    String FIELD_RETURN_CODE = "return_code";
    /** 参数: return_msg(XML格式) */
    String FIELD_RETURN_MSG = "return_msg";
    /** 参数: result_code(XML格式) */
    String FIELD_RESULT_CODE = "result_code";
    /** 参数: err_code(XML格式) */
    String FIELD_ERR_CODE = "err_code";
    /** 参数: err_code_des(XML格式) */
    String FIELD_ERR_CODE_DES = "err_code_des";

    // =======================================================================================================
    // =======================================================================================================
    // =======================================================================================================
    /** 支付成功回调地址(商城) */
    String NOTIFY_URL_GOODS = IpConfig.url + ServletUtil.getMappingUrl("/notify/pay/wx/goods");
    /** 退款成功回调地址(商城) */
    String NOTIFY_URL_GOODS_CANCEL = IpConfig.url + ServletUtil.getMappingUrl("/notify/pay/wx/goodsCancel");

    /** 支付成功回调地址(商城购物车) */
    String NOTIFY_URL_GOODS_SHOP = IpConfig.url + ServletUtil.getMappingUrl("/notify/pay/wx/goodsShop");
    /** 退款成功回调地址(商城购物车) */
    String NOTIFY_URL_GOODS_SHOP_CANCEL = IpConfig.url + ServletUtil.getMappingUrl("/notify/pay/wx/goodsShopCancel");

    /** 微信支付成功回调地址(诚意金) */
    String NOTIFY_URL_ORDER_DEPOSIT = IpConfig.url + ServletUtil.getMappingUrl("/notify/pay/wx/deposit");
    /** 退款成功回调地址(诚意金) */
    String NOTIFY_URL_ORDER_DEPOSIT_CANCEL = IpConfig.url + ServletUtil.getMappingUrl("/notify/pay/wx/depositCancel");

    /** 支付成功回调地址(酒店) */
    String NOTIFY_URL_HOTEL = IpConfig.url + ServletUtil.getMappingUrl("/notify/pay/wx/hotel");
    /** 退款成功回调地址(酒店) */
    String NOTIFY_URL_HOTEL_CANCEL = IpConfig.url + ServletUtil.getMappingUrl("/notify/pay/wx/hotelCancel");

    /** 支付成功回调地址(新签) */
    String NOTIFY_URL_PAY_NEW = NOTIFY_URL_GOODS;
    /** 支付成功回调地址(续租) */
    String NOTIFY_URL_PAY_GO_ON = IpConfig.url + ServletUtil.getMappingUrl("/notify/pay/wx/notifyPayGoOn");
    /** 退款成功回调地址(新签) */
    String NOTIFY_URL_PAY_CANCEL_NEW = NOTIFY_URL_GOODS_CANCEL;
    /** 退款成功回调地址(续租) */
    String NOTIFY_URL_PAY_CANCEL_GO_ON = IpConfig.url + ServletUtil.getMappingUrl("/notify/pay/wx/notifyPayCancelGoOn");
    /** 主动退款成功回调地址(主订单) */
    String NOTIFY_URL_PAY_CANCEL_INITIATIVE =
        IpConfig.url + ServletUtil.getMappingUrl("/notify/pay/wx/notifyPayCancelInitiative");
    /** 主动退款成功回调地址(子订单) */
    String NOTIFY_URL_PAY_CANCEL_GO_ON_INITIATIVE =
        IpConfig.url + ServletUtil.getMappingUrl("/notify/pay/wx/notifyPayCanceGoOnlInitiative");

}